﻿#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
#include <vector>
#include <map>
#include <string>
#include <algorithm>
#include <deque>
#include <numeric>
#include <functional>
#include <ctime>

/*
需求分析：
1) 产生选手（ ABCDEFGHIJKLMNOPQRSTUVWX ）姓名、得分、选手编号；
2) 第1轮    选手抽签 选手比赛 查看比赛结果
3) 第2轮    选手抽签 选手比赛 查看比赛结果
4) 第3轮    选手抽签 选手比赛 查看比赛结果
*/
class Speaker
{
public:

	//3.姓名；
	string m_Name;
	//4.得分数组；
	int m_Score[3];
};
void createSpeaker(vector<int>& v, map<int, Speaker>& m)
{
	string nameSeed = "ABCDEFGHIJKLMNOPQRSTUVWX";
	for (int i = 0; i < nameSeed.size(); ++i)
	{
		string name = "选手";
		name += nameSeed[i];

		Speaker sp;
		sp.m_Name = name;
		for (int j = 0; j < 3; ++j)
		{
			sp.m_Score[j] = 0;
		}

		//6.选手编号：100~123；
		v.push_back(i + 100);
		m.insert(make_pair(i + 100, sp));
	}
}
//9.抽签；
void speechDrow(vector<int>& v)
{
	//10.洗牌；
	random_shuffle(v.begin(), v.end());
}
//13.index第几轮,v1比赛选手编号容器，m是选手编号和具体选手容器，v2晋级选手编号容器；
void speechContest(int index, vector<int>& v1, map<int, Speaker>& m, vector<int>& v2)
{
	//19.key分数，value编号，greater<int>从大到小排序；
	multimap<int, int, greater<int>>groupMap;
	int num = 0;

	for (vector<int>::iterator it = v1.begin(); it != v1.end(); ++it)
	{
		num++;
		deque<int>d;
		for (int i = 0; i < 10; ++i)
		{
			int score = rand() % 41 + 60;//60~100
			d.push_back(score);
		}
		//14.排序；
		sort(d.begin(), d.end());
		//15.去除最高最低分；
		d.pop_back();
		d.pop_front();
		//16.累积分数；
		int sum = accumulate(d.begin(), d.end(), 0);

		int avg = sum / d.size();
		//17.将平均分放入到m容器中；
		m[*it].m_Score[index - 1] = avg;

		//18.每6个人，取前三名，晋级；临时容器，保存6个人；临时容器，存入数据；
		groupMap.insert(make_pair(avg, *it));

		if (num % 6 == 0)
		{
			cout << "小组比赛成绩如下：" << endl;
			for (multimap<int, int, greater<int>>::iterator mit = groupMap.begin(); mit != groupMap.end(); ++mit)
			{
				cout << "编号：" << mit->second << " ，姓名：" << m[mit->second].m_Name << " ，得分：" << m[mit->second].m_Score[index - 1] << endl;
			}
			/*小组比赛成绩如下：
			编号：102 ，姓名：选手C ，得分：84
			编号：112 ，姓名：选手M ，得分：83
			...
			编号：122 ，姓名：选手W ，得分：68*/

			//21.取前三名；
			int count = 0;
			for (multimap<int, int, greater<int>>::iterator mit = groupMap.begin(); mit != groupMap.end(), count < 3; ++mit, ++count)
			{
				//22.晋级容器，获取数据；
				v2.push_back(mit->second);
			}

			//20.清空临时容器；
			groupMap.clear();
		}
	}
}
void showScore(int index, vector<int>& v, map<int, Speaker>& m)
{
	cout << "第 " << index << " 轮比赛成绩如下：" << endl;
	for (map<int, Speaker>::iterator it = m.begin(); it != m.end(); ++it)
	{
		cout << "选手编号： " << it->first << " ，姓名： " << it->second.m_Name << " ，分数： " << it->second.m_Score[index - 1] << endl;
	}
	cout << "晋级选手编号：" << endl;
	for (vector<int>::iterator it = v.begin(); it != v.end(); ++it)
	{
		cout << *it << endl;
	}
}

//main340：任务案例STL综合案例学校演讲比赛
int main340()
{
	//26.随机数种子；
	srand((unsigned int)time(NULL));


	//1.选手编号；
	vector<int>v1;
	//2.存放选手编号，及对应的具体选手；
	map<int, Speaker>m;

	//5.创建选手；
	createSpeaker(v1, m);

	//7.测试；
	/*for (map<int, Speaker>::iterator it = m.begin(); it != m.end(); ++it)
	{
		cout << "选手编号：" << it->first << " ，选手姓名：" << it->second.m_Name << endl;
	}*/
	/*选手编号：100 ，选手姓名：选手A
	选手编号：101 ，选手姓名：选手B
	...
	选手编号：123 ，选手姓名：选手X*/

	//8.抽签；
	speechDrow(v1);

	//12.进入下一轮比赛的人员编号；
	vector<int>v2;

	//11.比赛；从第一轮开始比赛；
	speechContest(1, v1, m, v2);

	//23.显示比赛结果；轮数，晋级编号，具体人员信息；
	showScore(1, v2, m);

	//24.第二轮比赛；
	speechDrow(v2);
	vector<int>v3;
	speechContest(2, v2, m, v3);
	showScore(2, v3, m);

	//25.第三轮比赛；
	speechDrow(v3);
	vector<int>v4;
	speechContest(3, v3, m, v4);
	showScore(3, v4, m);

	system("pause");
	return EXIT_SUCCESS;
}
/*
小组比赛成绩如下：
编号：122 ，姓名：选手W ，得分：88
编号：104 ，姓名：选手E ，得分：82
编号：116 ，姓名：选手Q ，得分：80
编号：113 ，姓名：选手N ，得分：78
编号：108 ，姓名：选手I ，得分：76
编号：119 ，姓名：选手T ，得分：74
小组比赛成绩如下：
编号：100 ，姓名：选手A ，得分：86
编号：123 ，姓名：选手X ，得分：81
编号：111 ，姓名：选手L ，得分：79
编号：112 ，姓名：选手M ，得分：77
编号：115 ，姓名：选手P ，得分：77
编号：107 ，姓名：选手H ，得分：76
小组比赛成绩如下：
编号：109 ，姓名：选手J ，得分：87
编号：101 ，姓名：选手B ，得分：85
编号：114 ，姓名：选手O ，得分：84
编号：120 ，姓名：选手U ，得分：80
编号：117 ，姓名：选手R ，得分：79
编号：105 ，姓名：选手F ，得分：75
小组比赛成绩如下：
编号：103 ，姓名：选手D ，得分：84
编号：110 ，姓名：选手K ，得分：84
编号：106 ，姓名：选手G ，得分：83
编号：102 ，姓名：选手C ，得分：81
编号：121 ，姓名：选手V ，得分：77
编号：118 ，姓名：选手S ，得分：75
第 1 轮比赛成绩如下：
选手编号： 100 ，姓名： 选手A ，分数： 86
选手编号： 101 ，姓名： 选手B ，分数： 85
选手编号： 102 ，姓名： 选手C ，分数： 81
选手编号： 103 ，姓名： 选手D ，分数： 84
选手编号： 104 ，姓名： 选手E ，分数： 82
选手编号： 105 ，姓名： 选手F ，分数： 75
选手编号： 106 ，姓名： 选手G ，分数： 83
选手编号： 107 ，姓名： 选手H ，分数： 76
选手编号： 108 ，姓名： 选手I ，分数： 76
选手编号： 109 ，姓名： 选手J ，分数： 87
选手编号： 110 ，姓名： 选手K ，分数： 84
选手编号： 111 ，姓名： 选手L ，分数： 79
选手编号： 112 ，姓名： 选手M ，分数： 77
选手编号： 113 ，姓名： 选手N ，分数： 78
选手编号： 114 ，姓名： 选手O ，分数： 84
选手编号： 115 ，姓名： 选手P ，分数： 77
选手编号： 116 ，姓名： 选手Q ，分数： 80
选手编号： 117 ，姓名： 选手R ，分数： 79
选手编号： 118 ，姓名： 选手S ，分数： 75
选手编号： 119 ，姓名： 选手T ，分数： 74
选手编号： 120 ，姓名： 选手U ，分数： 80
选手编号： 121 ，姓名： 选手V ，分数： 77
选手编号： 122 ，姓名： 选手W ，分数： 88
选手编号： 123 ，姓名： 选手X ，分数： 81
晋级选手编号：
122
104
116
100
123
111
109
101
114
103
110
106
小组比赛成绩如下：
编号：123 ，姓名：选手X ，得分：82
编号：104 ，姓名：选手E ，得分：82
编号：100 ，姓名：选手A ，得分：81
编号：110 ，姓名：选手K ，得分：81
编号：114 ，姓名：选手O ，得分：77
编号：116 ，姓名：选手Q ，得分：75
小组比赛成绩如下：
编号：109 ，姓名：选手J ，得分：84
编号：103 ，姓名：选手D ，得分：81
编号：111 ，姓名：选手L ，得分：80
编号：122 ，姓名：选手W ，得分：79
编号：101 ，姓名：选手B ，得分：76
编号：106 ，姓名：选手G ，得分：74
第 2 轮比赛成绩如下：
选手编号： 100 ，姓名： 选手A ，分数： 81
选手编号： 101 ，姓名： 选手B ，分数： 76
选手编号： 102 ，姓名： 选手C ，分数： 0
选手编号： 103 ，姓名： 选手D ，分数： 81
选手编号： 104 ，姓名： 选手E ，分数： 82
选手编号： 105 ，姓名： 选手F ，分数： 0
选手编号： 106 ，姓名： 选手G ，分数： 74
选手编号： 107 ，姓名： 选手H ，分数： 0
选手编号： 108 ，姓名： 选手I ，分数： 0
选手编号： 109 ，姓名： 选手J ，分数： 84
选手编号： 110 ，姓名： 选手K ，分数： 81
选手编号： 111 ，姓名： 选手L ，分数： 80
选手编号： 112 ，姓名： 选手M ，分数： 0
选手编号： 113 ，姓名： 选手N ，分数： 0
选手编号： 114 ，姓名： 选手O ，分数： 77
选手编号： 115 ，姓名： 选手P ，分数： 0
选手编号： 116 ，姓名： 选手Q ，分数： 75
选手编号： 117 ，姓名： 选手R ，分数： 0
选手编号： 118 ，姓名： 选手S ，分数： 0
选手编号： 119 ，姓名： 选手T ，分数： 0
选手编号： 120 ，姓名： 选手U ，分数： 0
选手编号： 121 ，姓名： 选手V ，分数： 0
选手编号： 122 ，姓名： 选手W ，分数： 79
选手编号： 123 ，姓名： 选手X ，分数： 82
晋级选手编号：
123
104
100
109
103
111
小组比赛成绩如下：
编号：103 ，姓名：选手D ，得分：80
编号：100 ，姓名：选手A ，得分：80
编号：123 ，姓名：选手X ，得分：79
编号：109 ，姓名：选手J ，得分：78
编号：104 ，姓名：选手E ，得分：77
编号：111 ，姓名：选手L ，得分：77
第 3 轮比赛成绩如下：
选手编号： 100 ，姓名： 选手A ，分数： 80
选手编号： 101 ，姓名： 选手B ，分数： 0
选手编号： 102 ，姓名： 选手C ，分数： 0
选手编号： 103 ，姓名： 选手D ，分数： 80
选手编号： 104 ，姓名： 选手E ，分数： 77
选手编号： 105 ，姓名： 选手F ，分数： 0
选手编号： 106 ，姓名： 选手G ，分数： 0
选手编号： 107 ，姓名： 选手H ，分数： 0
选手编号： 108 ，姓名： 选手I ，分数： 0
选手编号： 109 ，姓名： 选手J ，分数： 78
选手编号： 110 ，姓名： 选手K ，分数： 0
选手编号： 111 ，姓名： 选手L ，分数： 77
选手编号： 112 ，姓名： 选手M ，分数： 0
选手编号： 113 ，姓名： 选手N ，分数： 0
选手编号： 114 ，姓名： 选手O ，分数： 0
选手编号： 115 ，姓名： 选手P ，分数： 0
选手编号： 116 ，姓名： 选手Q ，分数： 0
选手编号： 117 ，姓名： 选手R ，分数： 0
选手编号： 118 ，姓名： 选手S ，分数： 0
选手编号： 119 ，姓名： 选手T ，分数： 0
选手编号： 120 ，姓名： 选手U ，分数： 0
选手编号： 121 ，姓名： 选手V ，分数： 0
选手编号： 122 ，姓名： 选手W ，分数： 0
选手编号： 123 ，姓名： 选手X ，分数： 79
晋级选手编号：
103
100
123
*/